package com.bsj.sipgateway.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bsj.power.common.config.redis.RedisConstant;
import com.bsj.power.common.def.dto.RedisDeviceInfo;
import com.bsj.sipgateway.common.constant.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.bsj.JedisClusterBSJ;
import redis.clients.bsj.JedisClusterHelper;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @Description 关于视频设备的缓存操作
 * @Author zhaoyang
 * @Date 2024/7/10 16:52
 */
@Component
public class RedisDeviceInfoUtil {

    @Autowired
    private JedisClusterBSJ jedisClusterBSJ;

//    /**
//     * 批量查询出场景下的设备di数据
//     *
//     * @param sceneIds 场景ID集合
//     * @return
//     * @throws Exception
//     */
//    public Map<Long, RedisDeviceInfo> getRedisDeviceInfo(List<Integer> sceneIds) {
//        List<String> keyList = new LinkedList<>();
//        for (Integer sceneId : sceneIds) {
//            keyList.add(RedisConstant.REDIS_DEVICE_INFO + sceneId);
//        }
//        Map<Long, RedisDeviceInfo> deviceDiMap = new HashMap<>();
//        Map<String, Map<byte[], byte[]>> gStrMap = JedisClusterHelper.hgetByteAll(jedisClusterBSJ, keyList);
//
//        for (Map.Entry<String, Map<byte[], byte[]>> entry : gStrMap.entrySet()) {
//            // 解数据
//            Map<byte[], byte[]> vMap = entry.getValue();
//            for (Map.Entry<byte[], byte[]> vEntry : vMap.entrySet()) {
//                Long did = Long.parseLong(new String(vEntry.getKey()));
//                RedisDeviceInfo redisDeviceInfo = JSON.parseObject(new String(vEntry.getValue()), RedisDeviceInfo.class);
//                deviceDiMap.put(did, redisDeviceInfo);
//            }
//        }
//        return deviceDiMap;
//    }
//
//    /**
//     * 根据场景id和设备id获取di数据
//     *
//     * @param sceneId
//     * @param did
//     * @return
//     */
//    public RedisDeviceInfo getRedisDeviceInfo(Integer sceneId, Long did) {
//        String hget = jedisClusterBSJ.hget(RedisConstant.REDIS_DEVICE_INFO + sceneId, did + "");
//        if (hget == null || "".equals(hget)) {
//            return null;
//        }
//        return JSON.parseObject(hget, RedisDeviceInfo.class);
//    }
//
//
//    /**
//     * redis添加di数据
//     *
//     * @param sceneId
//     * @param redisDeviceInfo
//     */
//    public void setRedisDeviceInfo(Integer sceneId, RedisDeviceInfo redisDeviceInfo) {
//        jedisClusterBSJ.hset(RedisConstant.REDIS_DEVICE_INFO + sceneId,
//                redisDeviceInfo.getId() + "", JSONObject.toJSONString(redisDeviceInfo));
//    }
//
//
//    /**
//     * 删除redis中的di数据
//     *
//     * @param sceneId
//     * @param did
//     */
//    public void delRedisDeviceInfo(Integer sceneId, Long did) {
//        jedisClusterBSJ.hdel(RedisConstant.REDIS_DEVICE_INFO + sceneId, did + "");
//    }


    public void setRedisDeviceInfo(RedisDeviceInfo redisDeviceInfo) {
        jedisClusterBSJ.set(RedisConstant.REDIS_DEVICE_INFO + redisDeviceInfo.getDeviceId()
                , JSONObject.toJSONString(redisDeviceInfo));
    }

    public RedisDeviceInfo getRedisDeviceInfo(String deviceId) {
        String str = jedisClusterBSJ.get(RedisConstant.REDIS_DEVICE_INFO + deviceId);
        if (str != null && !"".equals(str)) {
            return JSONObject.parseObject(str, RedisDeviceInfo.class);
        }
        return null;
    }


    // redis数据超过三分钟就是离线
    public boolean checkOnline(String deviceId) {
        RedisDeviceInfo redisDeviceInfo = getRedisDeviceInfo(deviceId);
        if (redisDeviceInfo == null) {
            return false;
        } else {
            /**
             * 这里用两个字段来判断是否离线，因为当设备在线的情况下，系统突然宕机，
             * 并且重启后设备不再上线，这时候redis的在线状态仍然是1，属于假在线，
             * 所以判断两者都成立才是在线
             */
            return redisDeviceInfo.getOnline() == Constants.DEVICE_ONLINE
                    && (System.currentTimeMillis() - redisDeviceInfo.getKeepAliveTime()) < 180000L;
        }
    }

    /**
     * 获取redis中视频设备云台锁定状态
     * 获取的是用户信息中的userId和userWeight,结构是 userId + "_" + userWeight
     *
     * @param deviceId
     * @return
     */
    public String getPtzControlLock(String deviceId) {
        return jedisClusterBSJ.get(RedisConstant.PTZ_CONTROL_LOCK + deviceId);
    }


}
